class EventBus {
  events = new Map()
  maxListeners = 10
  constructor(maxListeners?: number) {
    this.maxListeners = maxListeners || 10; // 设立监听上限
  }

  // 触发名为type的事件
  emit(type: string, ...args: any) {
    let handler = null;
    handler = this.events.get(type);
    // console.log('🚀 ~ file: eventBus.js:12 ~ EventBus ~ emit ~ handler:', handler, args);
    if (handler === undefined) {
      return false;
    }
    if (Array.isArray(handler)) {
      // 如果是一个数组说明有多个监听者,需要依次此触发里面的函数
      // eslint-disable-next-line no-plusplus
      for (let i = 0; i < handler.length; i++) {
        if (args.length > 0) {
          handler[i].apply(this, args);
        } else {
          handler[i].call(this);
        }
      }
    } else {
      // 单个函数的情况我们直接触发即可
      // eslint-disable-next-line no-lonely-if
      if (args.length > 0) {
        handler.apply(this, args);
      } else {
        handler.call(this);
      }
    }
    return true;
  }

  // 监听名为type的事件
  on(type: string, fn: (args: any) => void) {
    const handler = this.events.get(type);
    if (!handler) {
      this.events.set(type, fn);
    } else if (handler && typeof handler === 'function') {
      // 如果handler是函数说明只有一个监听者
      this.events.set(type, [handler, fn]); // 多个监听者我们需要用数组储存
    } else {
      handler.push(fn); // 已经有多个监听者,那么直接往数组里push函数即可
    }
    // console.log('eventbus监听的函数', type, this.events.get(type));
  }

  // eslint-disable-next-line consistent-return
  remove(type: string, fn?: () => void) {
    const handler = this.events.get(type); // 获取对应事件名称的函数清单
    // console.log('eventbus删除的函数', type, handler);
    if (handler && typeof handler === 'function') {
      // 如果是函数,说明只被监听了一次
      this.events.delete(type);
    } else {
      if (handler === undefined) {
        return false;
      }
      if (!fn && handler) {
        this.events.delete(type);
      }
      let position = null;
      // 如果handler是数组,说明被监听多次要找到对应的函数
      // eslint-disable-next-line no-plusplus
      for (let i = 0; i < handler.length; i++) {
        if (handler[i] === fn) {
          position = i;
        } else {
          position = -1;
        }
      }
      // 如果找到匹配的函数,从数组中清除
      if (position !== -1) {
        // 找到数组对应的位置,直接清除此回调
        handler.splice(position, 1);
        // 如果清除后只有一个函数,那么取消数组,以函数形式保存
        if (handler.length === 1) {
          this.events.set(type, handler[0]);
        }
      } else {
        return this;
      }
    }
  }
}
export enum EventBusEmitType {
  /**
   * 当文件被修改并保存时
   */
  OnFileSaved = 'onFileSaved',
  /**
  * 当文件开始被上传下载时
  */
  OnFileUploadDownStart = 'onFileUploadDownStart',
  /**
   * 登录过期,跳转登录页面
   */
  OnGoToLogin = 'onGoToLogin',
  /**
   * 待办工作被处理
   */
  WorkFlowTaskInvoke = 'WorkFlowTaskInvoke',
}
const eventBus = new EventBus();
export default eventBus;